/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CiaAerea;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Andre
 */
public class VooSerialize implements Serializable {
    
        private int codigoIdentificar;
    private String data;
    private String hora;
    private double valorPassagemEconomica;
    private double valorPassagemExecutiva;
    private int numeroLugaresVagos;
    private int numeroLugaresOcupados;
    private boolean mapaDeOcupacao[][];
    private AeronaveSerialize aeronaveVoo;
    private DestinoSerialize destinoVoo;
    private Hashtable<Integer, Reserva> HreservaVoo = new Hashtable<Integer, Reserva>();

        public VooSerialize() throws Exception{
//        setCodigoIdentificador(codigoIdentificar);
//        setData("00/00");
//        setHora("00.00");
//        setValorPassagemEconomica(200.00);
//        setValorPassagemExecutiva(500.00);
//        setNumLugaresVagos(100); /*ALTERAR*/
//        setNumLugaresOcupados(0);

//        aeronaveVoo = null;
        destinoVoo = null;

        
    }

    //Construtor sobrecarregado da classe Voo
    public VooSerialize(int Vcod, String Vdata, String Vhora, double VPEc, double VPEx, DestinoSerialize destino) 
            throws Exception {
        setCodigoIdentificador(Vcod);
        setData(Vdata);
        setHora(Vhora);
        setValorPassagemEconomica(VPEc);
        setValorPassagemExecutiva(VPEx);

        destinoVoo = destino;

    }

    //Funções de SET para a classe Voo
    public void setCodigoIdentificador(int Vcod) throws Exception {
        String codigo = Vcod + "";
        
        if(codigo.isEmpty()){
            throw new Exception("Campo vazio");
        }else{
            this.codigoIdentificar = Vcod;
        }
        
    }

    public void setData(String Vdata) throws Exception {

        if (Vdata.isEmpty()) {
            throw new Exception("Campo Data vazio");

        } else {
            data = Vdata;
        }
    }

    public void setHora(String Vhora) throws Exception {

        if (Vhora.isEmpty()) {
            throw new Exception("Campo Hora vazio");

        } else {
            
            for (int i = 0; i < Vhora.length(); i++) {
                if (!Character.isLetterOrDigit(Vhora.charAt(i))) {
                    throw new Exception("Caractere Invalido no campo Hora");
                } else {
                    hora = Vhora;
                }
            }
        }

    }

    public void setValorPassagemEconomica(double VPEc) throws Exception {

        if (VPEc < 0) {
            throw new Exception("Valor da passagem economica negativa");
        } else {
            this.valorPassagemEconomica = VPEc;
        }

    }

    public void setValorPassagemExecutiva(double VPEx) throws Exception {

        if (VPEx < 0) {
            throw new Exception("Valor da passagem executiva negativa");
        } else {
            this.valorPassagemExecutiva = VPEx;
        }

    }

    public void setNumLugaresVagos(int Vlivre) throws Exception {

        if (Vlivre < 0) {
            throw new Exception("Número de lugares vagos inválidos");
        } else {
            this.numeroLugaresVagos = Vlivre;
        }


    }

    public void setNumLugaresOcupados(int Vocupado) throws Exception {

        if (Vocupado < 0) {
            throw new Exception("Número de lugares ocupados inválidos");
        } else {
            this.numeroLugaresOcupados = Vocupado;
        }

    }

    public void setmapaAssentos(AeronaveSerialize Airbus) throws Exception {
        int fileiras, assentos;

        if (Airbus == null) {
            throw new Exception("Aeronave inexistente!");
        } else {
            fileiras = Airbus.getNumTotalFileiras();
            assentos = Airbus.getNumAssentosPorFileira();


            mapaDeOcupacao = new boolean[fileiras][assentos];

            //Inicialização do mapa de acento
            for (int i = 0; i < fileiras; i++) {
                for (int j = 0; j < assentos; j++) {
                    mapaDeOcupacao[i][j] = false;
                }
            }
        }
    }

    public void setAeronaveVoo(AeronaveSerialize Airbus) throws Exception {

        if (Airbus == null) {
            throw new Exception("Aeronave inexistente");
        } else {
            aeronaveVoo = Airbus;
            int lugaresvagos = aeronaveVoo.getNumAssentosPorFileira() * aeronaveVoo.getNumTotalFileiras();
            setNumLugaresVagos(lugaresvagos);
            setNumLugaresOcupados(0);
            setmapaAssentos(Airbus);
        }


    }

    public void setDestinoVoo(DestinoSerialize destino) throws Exception {

        if (destino == null) {
            throw new Exception("Destino inexistente");
        } else {
            destinoVoo = destino;
        }

    }

    public void setReservaVoo(Reserva R) throws Exception{
        
        if (R == null) {
            throw new Exception("Reserva inexistente");
        } else {
            HreservaVoo.put(R.getCodReserva(), R);

            numeroLugaresOcupados++;
            numeroLugaresVagos--;
        }

    }

    //Funções de GET para a classe Voo
    public int getCodigoIdentificar() {
        return codigoIdentificar;
    }

    public String getData() {
        return this.data;
    }

    public String getHora() {
        return this.hora;
    }

    public double getValorPassagemEconomica() {
        return this.valorPassagemEconomica;
    }

    public double getValorPassagemExecutiva() {
        return this.valorPassagemExecutiva;
    }

    public int getNumeroLugaresVagos() {
        return numeroLugaresVagos;
    }

    public int getNumeroLugaresOcupados() {
        return numeroLugaresOcupados;
    }

    public boolean[][] getMapaDeOcupacao() {
        return mapaDeOcupacao;
    }

    public Enumeration<Integer> getAllReservaVoo() {
        return HreservaVoo.keys();
    }

    public AeronaveSerialize getAeronaveVoo() {
        return aeronaveVoo;
    }

    public DestinoSerialize getDestinoVoo() {
        return destinoVoo;
    }

    public Reserva getReservaVoo(int codVoo) {
        return HreservaVoo.get(codVoo);
    }

    //Funções de GET para a classe Destino
    public int getCodigoIdentificador() {
        return this.codigoIdentificar;
    }

    public int getNumLugaresVagos() {
        return this.numeroLugaresVagos;
    }

    public int getNumLugaresOcupados() {
        return this.numeroLugaresOcupados;
    }

    //Métodos
    public boolean AssentoOcupado(char Fileira, int Assento) throws Exception{
        boolean situacao;
        int posFileira;


        //Conversão de char para inteiro, seguindo a tabela ASCII A = 65
        posFileira = Integer.valueOf(Fileira) - 65;


        //Se a posição for TRUE, então o assento está ocupado
        if (mapaDeOcupacao[posFileira][Assento]) {

            situacao = true;

        } else {

            situacao = false;
        }


        return (situacao);
    }

    public void setOcupacao(char fileira, int assento) {
        int posFileira;

        posFileira = Integer.valueOf(fileira) - 65;

        mapaDeOcupacao[posFileira][assento] = true;

    }

    public void setDesocupacao(char fileira, int assento) {
        int posFileira;

        posFileira = Integer.valueOf(fileira) - 65;

        mapaDeOcupacao[posFileira][assento] = false;

    }

    public void removeReserva(int codReserva) {

        //Remover do Hashtable
        HreservaVoo.remove(codReserva);

    }
    
    public void escrever(VooSerialize dados) throws Exception
    {
        try
        {
            //Verifica se arquivo é existente
            
            File arquivo = new File("Voos/"+"voo_"+ dados.getCodigoIdentificador() +".ser");
            if(arquivo.exists()){
                throw new Exception("Arquivo já existente!");
            }
            else{
            ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("Voos/"+"voo_"+dados.getCodigoIdentificador()+".ser"));
            saida.writeObject(dados);
            }
            
        }catch(IOException ioException)
        {
            throw new Exception("Erro ao serializar");
        }
    }
    
    public VooSerialize ler(String cod) throws Exception
    {
        VooSerialize dados = new VooSerialize();
        try
        {
            ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("Voos/"+"voo_"+cod+".ser"));
             
            dados = (VooSerialize) entrada.readObject(); 
            
            
            
            
        }catch(IOException ioException)
        {
            System.err.println(ioException.getMessage());
       
         } catch (ClassNotFoundException ex) {
            Logger.getLogger(Voo.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
           return dados; 
        }
    
    }
    
    public void remover(String cod)
    {
        try
        {
            //FALTA IMPLEMENTAR AINDA

           File file = new File("Voos/"+"voo_"+cod+".ser");
           
            JOptionPane.showMessageDialog(null, file.getName());
           if(file.delete())
           {
               JOptionPane.showMessageDialog(null, "Arquivo deletado com sucesso!");
           }
           else
           {
               JOptionPane.showMessageDialog(null, "Problemas ao deletar o arquivo.");
           }
           
            
            
        }catch(Exception e)
        {
            System.err.println(e.getMessage());
        }
    }
    
    public void alterar(VooSerialize dados) throws Exception{
        
        try{
    ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("Voos/"+"voo_"+dados.getCodigoIdentificador()+".ser"));
        saida.writeObject(dados);
        }catch(Exception e){
            throw new Exception("Erro ao Alterar!");
        }
            
        
    }
}
